package cn.redbanners.spiderTest;


import java.io.IOException;

import org.apache.log4j.Logger;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import cn.redbanners.httpclient_utils.downloadss;
import cn.redbanners.pojos.SpiderFruit;

//望同学举一反三~  

public class test {
	//这个类的Logger对象可以把自定义的log日志写入.log文件

	public static void main(String[] args) throws IOException {
		final Logger logger = Logger.getLogger(test.class);
		final String URL="https://www.cnblogs.com/";
		
		// 用httpClient获取网页(downloadss重载方法:如果传入代理IP则用代理IP,不传则用当前IP)
		logger.info("\n\r"+"---------------------开始抓取页面----------------------"+"\n\r");
		SpiderFruit SpiderFruit = downloadss.getPageContent(URL);
		 
		//爬取网页标签的长度
		int length = SpiderFruit.getEntitystr().length();
	
		//状态码
		Integer statusCode = SpiderFruit.getStatusCode();
		
		if(length !=0  && statusCode.equals(200) ) {
			logger.info("\n\r"+"爬取页面 |"+URL+" | SUCCESS成功"+"\n\r");
		}else {
			logger.error("\n\r"+"爬取页面 |"+URL+"| ERROR错误"+"\n\r"+"状态码:"+statusCode+"\n\r"+"网页长度:"+length+"\n\r");
		}
		
		
		// 用Jsoup将网页解析为文档对象
		Document doc = Jsoup.parse(SpiderFruit.getEntitystr());

		
		// 1.获取任意标签返回多个元素:爬的是知乎记得换URL
		  /*Tag_Demo(doc);*/
		 

		// 2.使用标签ID获取元素获得单个元素
		 /* Demo_ID(doc);*/
		 

		// 3.使用标签Class获取元素
		 /*Class_Demo(doc);*/

		
		//通过Html层叠标签后找到目标数据:以下是播客园title模板:并不能解析DOM元素的属性值
		// 文档对象.select() :括号里面写选择器语法 | ID用 #id值 | class用 .class | 没有id和class的用标签名
		/*titles_Demo(doc);*/
		
		
		//在当前页面获取任意标签中带有[任意属性]的DOM元素和被包裹的文本:并不能解析DOM元素的属性值
		/*Aherf_Demo(doc);*/
		
		//获取DOM元素的属性值
		//对Elements对象.attr()解析Elements元素的任意属性值
		
		//通过Html层叠标签后找到目标数据:以下是播客园首页博客用户头像模板:并用attr()解析element元素的属性值
		/*titleimg_DOM(doc);*/
		Elements Titleimgs = doc.select("img[src$=.png]");
		
		//置空节省资源
		doc=null;

		for (Element element : Titleimgs) {//查找扩展名为Png结尾的DOM元素
			//并用attr()解析element获取src属性的值
			System.out.println( element.attr("src").toString());
		
		}
		
		
/*		//获取第一个匹配到的title标签的DOM元素
		System.out.println(doc.getElementsByTag("title").first());
		//获取最后匹配到的title标签的DOM元素
		System.out.println(doc.getElementsByTag("title").last());*/
		
		
		logger.info("\n\r"+"-----------------解析页面完成--------------"+"\n\r");
	}

	// 通过Html层叠标签后找到目标数据:以下是播客园首页博客用户头像模板:并不能解析DOM元素的属性值
	private static void titleimg_DOM(Document doc) {
		Elements Titleimgs = doc.select("img[src$=.png]");
		for (Element element : Titleimgs) {// 查找扩展名为Png结尾的DOM元素
			// 获取src的地址
			System.out.println(element.attr("src"));
		}
	}

	// 在当前页面获取A元素中带有[href]的DOM元素或DOM包裹的文本
	private static void Aherf_Demo(Document doc) {
		Elements select = doc.select("img[src]");
		for (Element element : select) {
			// 获取DOM元素
			System.out.println(element.toString());

			// 获取DOM元素包裹的文本
			System.out.println(element.text());
		}
	}

	// 通过Html层叠标签后找到目标数据:以下是播客园title模板
	private static void titles_Demo(Document doc) {
		// 文档对象.select() :括号里面写选择器语法 | ID用 #id值 | class用 .class | 没有id和class的用标签名

		Elements titles = doc.select("#post_list .post_item .post_item_body  h3 a");
		for (Element element : titles) {
			System.out.println(element.text());
		}
	}

	// 如果是用文本显示:则标签获取匹配的第一个Class所有元素并以文本展示 //如果是用Html显示:则符合的标签全部显示 String text =
	private static void Class_Demo(Document doc) {
		String text = doc.getElementsByClass("post_item").text();
		System.out.println(text);
	}

	private static void Demo_ID(Document doc) {
		// 使用标签ID获取元素获得单个元素
		String elementById = doc.getElementById("shicineirong").text();
		System.out.println(elementById);
	}

	private static void Tag_Demo(Document doc) {
		// 获取任意标签返回多个元素
		// [获取HTML标签是title的所有元素]Demo1 获取文章 https://zhuanlan.zhihu.com/p/30974799
		Elements h2s = doc.getElementsByTag("h2"); // 根据HTML_Tag名称来获得多个标签字段； Elements
		Elements blockquotes = doc.getElementsByTag("blockquote");
		for (int i = 0; i < h2s.size(); i++) {
			// 获取索引上的元素并以文本展示 System.out.println(h2s.get(i).text());
			System.out.println(blockquotes.get(i).text());
			System.out.println();

		}
	}
}
